/* Copyright (c) [2020] [ylc]. Licensed under Apache-2.0 License. */

#ifndef __KEY_DRIVE_H
#define __KEY_DRIVE_H

#include "my_define.h"

//按键配置项
#define KEY_NUM 2
#define KEY_LONG_S 1 //连续长按启动时间

typedef volatile struct
{
	struct {
		//以下状态由按键扫描函数使用，外部只读
		u8 lock_1s : 1; //长按状态锁
		u8 lock_2s : 1;
		u8 lock_6s : 1;
		u8 press : 1;		//按下状态
		u8 double_scan : 1; //等待双击

		//以下状态由按键任务使用
		u8 key_short : 1;  //短按
		u8 key_double : 1; //双击
		u8 key_long : 1;   //连续长按，按下达到启动时间后，每100ms产生一个连续长按事件
		u8 long_1s : 1;	   //长按1s
		u8 long_2s : 1;
		u8 long_6s : 1;
	} flags;
	u8 count;			   //用来消抖
	u16 double_ticks_10ms; //用来检测双击
	u16 long_ticks_10ms;   //用来检测长按
	u8 (*read_port)(void); //按下返回1，否则返回0
	void (*key_short_callback)(void);
	void (*key_double_callback)(void);
	void (*key_long_callback)(void);
	void (*key_long_1s_callback)(void);
	void (*key_long_2s_callback)(void);
	void (*key_long_6s_callback)(void);

} my_key_t;
extern my_key_t mKey[KEY_NUM];

void Task_key(void);

#endif
